模型验证器

译者:飞龙

来源:Model Validations

Enforce模块用于验证数据。对于使用以前的验证器的用户,还可以继续使用,它们中的一部分整合到了enforce,剩余部分还没有。推荐你开始使用orm.enforce来取代orm.validators。可用的验证器的列表请见node-enforce

unique验证器也构建于ORM中,可以这样来访问:

  1. name: orm.enforce.unique("name already taken!")
  2. name: orm.enforce.unique({ scope: ['age'] }, "Sorry, name already taken for this age group")
  3. name: orm.enforce.unique({ ignoreCase: true }) // 'John' is same as 'john' (mysql is case insensitive by default)

你可以为模型的每个属性定义验证器。对于每个属性,你可以定义一个或多个验证器。你也可以使用预定义的验证器,或者自己新建。

  1. var Person = db.define("person", {
  2. name : String,
  3. age : Number
  4. }, {
  5. validations : {
  6. name : orm.enforce.ranges.length(1, undefined, "missing"), // "missing" is a name given to this validation, instead of default
  7. age : [ orm.enforce.ranges.number(0, 10), orm.enforce.lists.inside([ 1, 3, 5, 7, 9 ]) ]
  8. }
  9. });

上面的代码限定了name的长度必须在1和undefined之间(undfined表示任意值),以及age必须在0和10(闭区间)之间,而且是列出的值之一。这个例子或许没有意义,但是足够解释了。

保存一个对象的时候,如果由任何一个验证器验证失败,你都会得到一个带有属性名称和验证错误描述的error对象。这个描述可以帮助你弄清楚发生了什么。

  1. var John = new Person({
  2. name : "",
  3. age : 20
  4. });
  5. John.save(function (err) {
  6. // err.field = "name" , err.value = "" , err.msg = "missing"
  7. });

在第一个验证器验证失败之后,验证就停止了。如果你想要验证每个属性并且返回所有验证错误,你可以在全局或局部设置中更改这一行为:

  1. var orm = require("orm");
  2. orm.settings.set("instance.returnAllErrors", true); // global or..
  3. orm.connect("....", function (err, db) {
  4. db.settings.set("instance.returnAllErrors", true); // .. local
  5. // ...
  6. var John = new Person({
  7. name : "",
  8. age : 15
  9. });
  10. John.save(function (err) {
  11. assert(Array.isArray(err));
  12. // err[0].property = "name" , err[0].value = "" , err[0].msg = "missing"
  13. // err[1].property = "age" , err[1].value = 15 , err[1].msg = "out-of-range-number"
  14. // err[2].property = "age" , err[2].value = 15 , err[2].msg = "outside-list"
  15. });
  16. });